""" Julia Menge Berechnung mit distance estimation www.3d-meier.de 22.01.1015 """ import c4d import math import cmath from c4d import gui from c4d import documents # Variablen und Konstanten Titel = 'Julia Menge' xMin = -1.60 # Wertebereich x xMax = 1.60 yMin = -1.00 # Wertebereich y yMax = 1.00 Nx = 1600 # Anzahl Punkte x Ny = 1000 # Anzahl Punkte y Nmax = 1000 # Iterationstiefe zMax = 2.0 # Maximaler z Wert Faktor = 1000 # Skalierungsfaktor a = -0.74543 # Konstante real b = 0.1130 # Konstante imaginär # Eingabedialog class MyDialogs(gui.GeDialog): res = False # Erzeugung des Layouts def CreateLayout(self): self.SetTitle(Titel) # Eingabe der Konstanten self.GroupBegin(2000, c4d.BFH_CENTER, 2, 0, "Bereich der komplexen Ebene") self.GroupBorder(c4d.BORDER_ROUND) self.GroupBorderSpace(15, 5, 15, 5) self.GroupSpace(90, 2) self.AddStaticText(2001, c4d.BFH_LEFT, 0, 0, 'x-Min', c4d.BORDER_NONE) self.AddEditNumber(1001, c4d.BFH_CENTER, 100, 0) self.AddStaticText(2002, c4d.BFH_LEFT, 0, 0, 'x-Max', c4d.BORDER_NONE) self.AddEditNumber(1002, c4d.BFH_CENTER, 100, 0) self.AddStaticText(2003, c4d.BFH_LEFT, 0, 0, 'y-Min', c4d.BORDER_NONE) self.AddEditNumber(1003, c4d.BFH_CENTER, 100, 0) self.AddStaticText(2004, c4d.BFH_LEFT, 0, 0, 'y-Max', c4d.BORDER_NONE) self.AddEditNumber(1004, c4d.BFH_CENTER, 100, 0) self.GroupEnd() self.AddSeparatorV(300, c4d.BFH_CENTER) # Eingabe der Startwerte self.GroupBegin(2005, c4d.BFH_CENTER, 2, 0, "Berechnung") self.GroupBorder(c4d.BORDER_ROUND) self.GroupBorderSpace(15, 5, 15, 5) self.GroupSpace(27, 2) self.AddStaticText(2006, c4d.BFH_LEFT, 0, 0, 'Anzahl Punkte x', c4d.BORDER_NONE) self.AddEditNumberArrows(1005, c4d.BFH_CENTER, 100, 0) self.AddStaticText(2007, c4d.BFH_LEFT, 0, 0, 'Anzahl Punkte y', c4d.BORDER_NONE) self.AddEditNumberArrows(1006, c4d.BFH_CENTER, 100, 0) self.AddStaticText(2008, c4d.BFH_LEFT, 0, 0, 'Iterationstiefe', c4d.BORDER_NONE) self.AddEditNumberArrows(1007, c4d.BFH_CENTER, 100, 0) self.AddStaticText(2009, c4d.BFH_LEFT, 0, 0, 'z-Max', c4d.BORDER_NONE) self.AddEditNumber(1008, c4d.BFH_CENTER, 100, 0) self.AddStaticText(2010, c4d.BFH_LEFT, 0, 0, 'Skalierungsfaktor', c4d.BORDER_NONE) self.AddEditNumber(1009, c4d.BFH_CENTER, 100, 0) self.AddStaticText(2011, c4d.BFH_LEFT, 0, 0, 'c-real', c4d.BORDER_NONE) self.AddEditNumber(1010, c4d.BFH_CENTER, 100, 0) self.AddStaticText(2012, c4d.BFH_LEFT, 0, 0, 'c-imaginär', c4d.BORDER_NONE) self.AddEditNumber(1011, c4d.BFH_CENTER, 100, 0) self.GroupEnd() self.AddSeparatorV(300, c4d.BFH_CENTER) # Dialog mit OK schließen self.AddDlgGroup(c4d.DLG_OK|c4d.DLG_CANCEL) return False # Variablen im Eingabemenü setzen def InitValues(self): self.SetReal(1001, xMin) self.SetReal(1002, xMax) self.SetReal(1003, yMin) self.SetReal(1004, yMax) self.SetLong(1005, Nx, 1, 1000000000) self.SetLong(1006, Ny, 1, 1000000000) self.SetLong(1007, Nmax, 1, 1000000000) self.SetReal(1008, zMax) self.SetReal(1009, Faktor) self.SetReal(1010, a) self.SetReal(1011, b) return True # Werte übernehmen wenn Dialog geschlossen def AskClose(self): global xMin, xMax, yMin, yMax, Nx, Ny, Nmax, zMax Faktor, a, b xMin = self.GetReal(1001) xMax = self.GetReal(1002) yMin = self.GetReal(1003) yMax = self.GetReal(1004) Nx = self.GetLong(1005) Ny = self.GetLong(1006) Nmax = self.GetLong(1007) zMax = self.GetReal(1008) Faktor = self.GetReal(1009) a = self.GetReal(1010) b = self.GetReal(1011) return False # ????? def Command(self, id, msg): if id == 1:self.res = True if id == 1 or id == 2: self.Close() return True def CreatePolygonObject(): # Polygonobjekt erzeugen obj = c4d.BaseObject(c4d.Opolygon) obj.ResizeObject((Nx+1)*(Ny+1), Nx*Ny) obj.SetName(Titel) # Konstante erzeugen c=complex(a, b) # Zähler zz=0 dis=0 # Segmentbreiten berechnen dx=(xMax-xMin)/(Nx-1) dy=(yMax-yMin)/(Ny-1) # Punkte erzeugen for j in xrange(0,Ny+1): for i in xrange(0,Nx+1): # Berechnung der Punkte y=yMax-j*dy x=xMin+i*dx # Punkt speichern obj.SetPoint(zz, c4d.Vector((x-dx/2)*Faktor,(y+dy/2)*Faktor,0)) # Zähler erhöhen zz=zz+1 # Polygone erzeugen zz=0 # Zähler zurücksetzen for j in xrange(0,Ny): for i in xrange(0,Nx): # Komplexe Zahl bilden y=yMax-j*dy x=xMin+i*dx z = complex(x, y) z1 = 1 # Iteration for k in xrange(0,Nmax): if abs(z) > zMax: break z1=2*z*z1 z = (z**2) + c dis=(abs(z)*cmath.log(z))/(2*abs(z1)) if abs(dis) < 0.00025: # Punkte für ein Quadrat definieren P1=j*(Nx+1)+i P2=j*(Nx+1)+i+1 P3=(j+1)*(Nx+1)+i+1 P4=(j+1)*(Nx+1)+i # Quadrat speichern obj.SetPolygon(zz, c4d.CPolygon(P1,P2,P3,P4)) # Zähler erhöhen zz=zz+1 # obj.Message(c4d.MSG_UPDATE) return obj def main(): dlg = MyDialogs() dlg.Open(c4d.DLG_TYPE_MODAL) if dlg.res: plyobj = CreatePolygonObject() doc.InsertObject(plyobj, None, None, True) doc.SetActiveObject(plyobj) c4d.CallCommand(14039) # Mesh optimieren c4d.EventAdd() if __name__=='__main__': main()